from flask import Flask, render_template
# 导入pymysql包
import pymysql

import cv2
import numpy as np

np.seterr(divide='ignore', invalid='ignore')

app = Flask(__name__)
app.config['SECRET_KEY'] = '1977206076@qq.com'
# 创建数据库连接
conn = pymysql.connect(host="81.68.81.180", port=3306, user="webgis", passwd="webgis", db="webgis",
                       charset="utf8")


# /upload/<path+fileName>
@app.route("/")  # 传入图片
def root():
    # 基于图像颜色，主要结合RGB和HSI两种判断依据进行火焰识别。

    img = cv2.imread('../fire/fire4.jpeg')

    redThre = 115  # 115~135红色分量阈值
    sThre = 60  # 55~65饱和度阈值

    B = img[:, :, 0]
    G = img[:, :, 1]
    R = img[:, :, 2]

    B1 = img[:, :, 0] / 255
    G1 = img[:, :, 1] / 255
    R1 = img[:, :, 2] / 255
    minValue = np.array(
        np.where(R1 <= G1, np.where(G1 <= B1, R1, np.where(R1 <= B1, R1, B1)), np.where(G1 <= B1, G1, B1)))
    sumValue = R1 + G1 + B1
    # HSI中S分量计算公式
    S = np.array(np.where(sumValue != 0, (1 - 3.0 * minValue / sumValue), 0))
    Sdet = (255 - R) / 20
    SThre = ((255 - R) * sThre / redThre)
    # 判断条件
    fireImg = np.array(
        np.where(R > redThre, np.where(R >= G, np.where(G >= B, np.where(S > 0, np.where(S > Sdet, np.where(
            S >= SThre, 255, 0), 0), 0), 0), 0), 0))

    gray_fireImg = np.zeros([fireImg.shape[0], fireImg.shape[1], 1], np.uint8)
    gray_fireImg[:, :, 0] = fireImg
    meBImg = cv2.medianBlur(gray_fireImg, 5)
    kernel = np.ones((5, 5), np.uint8)
    ProcImg = cv2.dilate(meBImg, kernel)
    # 绘制矩形框
    contours, _ = cv2.findContours(ProcImg, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    ResImg = img.copy()

    np.warnings.filterwarnings('ignore', category=np.VisibleDeprecationWarning)  # 解决numpy高版本通用警告
    number = np.size(contours)
    print(number)  # 得到该图中总的轮廓数量
    print(contours[0])  # 打印出第一个轮廓的所有点的坐标， 更改此处的0，为0--（总轮廓数-1），可打印出相应轮廓所有点的坐标
    # print(hierarchy)  # 打印出相应轮廓之间的关系
    for c in range(0, len(contours)):
        # 获取矩形的左上角坐标(x,y)，以及矩形的宽和高w、h

        x, y, w, h = cv2.boundingRect(contours[c])
        l_top = (x, y)
        r_bottom = (x + w, y + h)
        cv2.rectangle(ResImg, l_top, r_bottom, (255, 0, 0), 2)

    # 保存图片
    cv2.imwrite("fire/fire4-1.jpeg", ResImg)

    # # imshow函数的窗口标题中文乱码
    # def zh_ch(string):
    #     return string.encode("gbk").decode(errors="ignore")
    #
    # # 窗口显示蹄片
    # cv2.imshow(zh_ch('图片'), ResImg)
    # cv2.waitKey(0)  # 等待输入任何按键，当用户输入任何一个按键后即调用destroyAllWindows()关闭所有图像窗口
    # cv2.destroyAllWindows()  # 摧毁窗口

    # 获取一个游标对象
    cursor = conn.cursor()
    # 执行数据库插入操作
    sql = 'insert into identifyresult(recognition_input,recognition_out,data_number) values (%s,%s,%s)'

    args = (1, 'fire/fire4-1.jpeg', number)
    cursor.execute(sql, args)
    conn.commit()
    # 关闭游标
    cursor.close()
    # 关闭数据库连接

    """
    主页
    :return: Index.html
    """
    return str(number)  # 返回数据框标注的数量
    # return render_template('Index.html')


if __name__ == '__main__':
    # 开启debug
    app.debug = True
    app.run(debug=True, host='127.0.0.1', port='5000')
